package com.example.utils;

import jakarta.annotation.Resource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * 作者:xuSen
 * 日期2025/4/17 9:56
 */
@Component
public class FlowUtils {
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    /**
     * 检查指定操作是否可以在一段时间内仅执行一次
     * 该方法用于限制某个操作在指定时间范围内最多执行一次，常用于防止接口被频繁调用
     *
     * @param key 操作的唯一标识符，通常基于操作的类型和用户信息生成
     * @param blockTime 阻塞时间，单位为秒，表示一旦操作被记录，需要等待的时间
     * @return 如果操作在等待时间内已经执行过，则返回false；否则返回true，并记录操作
     */
    public boolean limitOnceCheck(String key, int blockTime){
        // 检查Redis中是否存在该操作的记录
        if(stringRedisTemplate.hasKey(key)){
            // 如果存在记录，则表示操作已经在等待时间内执行过，返回false
            return false;
        }else {
            // 如果不存在记录，则在Redis中设置操作记录，有效期为blockTime秒
            // 这样做是为了在接下来的blockTime秒内，防止该操作再次被执行
            stringRedisTemplate.opsForValue().set(key," ",blockTime, TimeUnit.SECONDS);
        }
        // 操作记录设置成功，返回true，表示操作可以执行
        return true;
    }
}
